home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / russell / gc32.lha / setjmp_test.c < prev    next >
C/C++ Source or Header  |  1993-04-01  |  3KB  |  130 lines

  1. /* Check whether setjmp actually saves registers in jmp_buf. */
  2. /* If it doesn't, the generic mark_regs code won't work.     */
  3. /* Compilers vary as to whether they will put x in a          */
  4. /* (callee-save) register without -O.  The code is         */
  5. /* contrived such that any decent compiler should put x in   */
  6. /* a callee-save register with -O.  Thus it is is          */
  7. /* recommended that this be run optimized.  (If the machine  */
  8. /* has no callee-save registers, then the generic code is    */
  9. /* safe, but this will not be noticed by this piece of       */
  10. /* code.)                             */
  11. #include <stdio.h>
  12. #include <setjmp.h>
  13. #include "config.h"
  14.  
  15. #ifdef __hpux
  16. /* X/OPEN PG3 defines "void* sbrk();" and this clashes with the definition */
  17. /* in gc_private.h, so we set the clock backwards with _CLASSIC_XOPEN_TYPES. */
  18. /* This is for HP-UX 8.0.
  19. /* sbrk() is not used in this file, of course.  W. Underwood, 15 Jun 1992 */
  20. #define _CLASSIC_XOPEN_TYPES
  21. #include <unistd.h>
  22. int
  23. getpagesize()
  24. {
  25.     return sysconf(_SC_PAGE_SIZE);
  26. }
  27. #endif
  28.  
  29. #if defined(SUNOS5)
  30. #define _CLASSIC_XOPEN_TYPES
  31. #include <unistd.h>
  32. int
  33. getpagesize()
  34. {
  35.     return sysconf(_SC_PAGESIZE);
  36. }
  37. #endif
  38.  
  39. #ifdef _AUX_SOURCE
  40. #include <sys/mmu.h>
  41. int
  42. getpagesize()
  43. {
  44.    return PAGESIZE;
  45. }
  46. #endif
  47.  
  48. #ifdef __OS2__
  49. #define INCL_DOSFILEMGR
  50. #define INCL_DOSMISC
  51. #define INCL_DOSERRORS
  52. #include <os2.h>
  53.  
  54. int
  55. getpagesize()
  56. {
  57.     ULONG result[1];
  58.     
  59.     if (DosQuerySysInfo(QSV_PAGE_SIZE, QSV_PAGE_SIZE,
  60.                     (void *)result, sizeof(ULONG)) != NO_ERROR) {
  61.         fprintf(stderr, "DosQuerySysInfo failed\n");
  62.         result[0] = 4096;
  63.     }
  64.     return((int)(result[0]));
  65. }
  66. #endif
  67.  
  68. struct {char a_a; char * a_b;} a;
  69.  
  70. int * nested_sp()
  71. {
  72.     int dummy;
  73.     
  74.     return(&dummy);
  75. }
  76.  
  77. main()
  78. {
  79.     int dummy;
  80.     long ps = getpagesize();
  81.     jmp_buf b;
  82.     register int x = strlen("a");  /* 1, slightly disguised */
  83.     static int y = 0;
  84.  
  85.     if (nested_sp() < &dummy) {
  86.       printf("Stack appears to grow down, which is the default.\n");
  87.       printf("A good guess for STACKBOTTOM on this machine is 0x%X.\n",
  88.              ((long)(&dummy) + ps) & ~(ps-1));
  89.     } else {
  90.       printf("Stack appears to grow up.\n");
  91.       printf("Define STACK_GROWS_UP in gc_private.h\n");
  92.       printf("A good guess for STACKBOTTOM on this machine is 0x%X.\n",
  93.              ((long)(&dummy) + ps) & ~(ps-1));
  94.     }
  95.     printf("Note that this may vary between machines of ostensibly\n");
  96.     printf("the same architecture (e.g. Sun 3/50s and 3/80s).\n");
  97.     printf("A good guess for ALIGNMENT on this machine is %d.\n",
  98.            (unsigned long)(&(a.a_b))-(unsigned long)(&a));
  99.     
  100.     /* Encourage the compiler to keep x in a callee-save register */
  101.     x = 2*x-1;
  102.     printf("");
  103.     x = 2*x-1;
  104.     setjmp(b);
  105.     if (y == 1) {
  106.         if (x == 2) {
  107.         printf("Generic mark_regs code probably wont work\n");
  108. #        if defined(SPARC) || defined(IBMRS6000) || defined(VAX) || defined(MIPS) || defined(M68K) || defined(I386) || defined(NS32K) || defined(RT)
  109.             printf("Assembly code supplied\n");
  110. #        else
  111.             printf("Need assembly code\n");
  112. #        endif
  113.         } else if (x == 1) {
  114.         printf("Generic mark_regs code may work\n");
  115.         } else {
  116.         printf("Very strange setjmp implementation\n");
  117.         }
  118.     }
  119.     y++;
  120.     x = 2;
  121.     if (y == 1) longjmp(b,1);
  122.     return(0);
  123. }
  124.  
  125. int g(x)
  126. int x;
  127. {
  128.     return(x);
  129. }
  130.